package edu.scau.mis.dashboard.Service.Imp;

import edu.scau.mis.dashboard.Service.ISaleItemService;
import edu.scau.mis.dashboard.dto.CategorySalesDTO;
import edu.scau.mis.dashboard.dto.MonthSalesDTO;
import edu.scau.mis.dashboard.mapper.SaleItemMapper;
import edu.scau.mis.dashboard.vo.PieDataVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@Service
public class SaleItemServiceImpl implements ISaleItemService {

    @Autowired
    private SaleItemMapper saleItemMapper;

    /**
     * 获取各年份各月销售数据
     * @return 年份为key，月份销售数据数组为value的Map
     */
    @Override
    public Map<Integer, BigDecimal[]> getYearlyMonthlySales() {
        Map<Integer, BigDecimal[]> result = new LinkedHashMap<>();

        // 获取所有年份
        List<Integer> years = saleItemMapper.selectDistinctSalesYears();

        for (Integer year : years) {
            // 初始化12个月的数据，默认值为0
            BigDecimal[] monthlySales = new BigDecimal[12];
            Arrays.fill(monthlySales, BigDecimal.ZERO);

            // 查询该年各月销售数据
            List<MonthSalesDTO> monthlyData = saleItemMapper.selectMonthlySalesByYear(year);

            // 填充有数据的月份
            for (MonthSalesDTO data : monthlyData) {
                monthlySales[data.getMonth() - 1] = data.getAmount();
            }

            result.put(year, monthlySales);
        }

        return result;
    }
    /**
     * 获取指定日期范围内销量前7的商品分类
     * @param startDate 开始日期（包含）
     * @param endDate 结束日期（包含）
     * @return 分类销售DTO列表，按销售额降序排列
     */
    @Override
    public List<CategorySalesDTO> getTopCategorySalesAmount(LocalDate startDate, LocalDate endDate) {
        if (startDate == null || endDate == null) {
            throw new IllegalArgumentException("日期参数不能为空");
        }
        if (startDate.isAfter(endDate)) {
            throw new IllegalArgumentException("开始日期不能晚于结束日期");
        }
        List<CategorySalesDTO> result = saleItemMapper.selectTopAmount(startDate, endDate);
        return result;
    }
    /**
     * 获取指定日期范围内销量前7的商品分类
     * @param startDate 开始日期（包含）
     * @param endDate 结束日期（包含）
     * @return 分类销售DTO列表，按销售量降序排列
     */
    @Override
    public List<PieDataVo> getTopCategorySalesQuantity(LocalDate startDate, LocalDate endDate) {
        if (startDate == null || endDate == null) {
            throw new IllegalArgumentException("日期参数不能为空");
        }
        if (startDate.isAfter(endDate)) {
            throw new IllegalArgumentException("开始日期不能晚于结束日期");
        }
        List<PieDataVo> result = saleItemMapper.selectTopQuantity(startDate, endDate);
        return result;
    }

}
